/**
 * 符号表引用
 * User: Zhikang.Peng
 * Date: 2018/04/26 17:00
 */
package heap

/**
 * 符号引用结构体继承关系图
 * SymbolRef
 *         |-ClassRef
 *         |-MemberRef (name,descriptor)
 *                   |-FieldRef (file)
 *                   |-MethodRef (method)
 *                   |-InterfaceMethodRef (Interface method)
 */
type SymbolRef struct {
	cp        *ConstantPool // 运行时常量池
	className string
	class     *Class
}

// 类符号引用解析
func (self *SymbolRef) ResolvedClass() *Class {
	if self.class == nil {
		self.resolveClassRef()
	}
	return self.class
}

/**
类D通过符号引用N引用类C的话，要解析N，先用D的类加载器加载C，
然后检查D是否有权限访问C，如果没有，则抛出IllegalAccessError异常
*/
func (self *SymbolRef) resolveClassRef() {
	d := self.cp.class
	c := d.classLoader.LoaderClass(self.className)
	if !c.isAccessibleTo(d) {
		panic("java.lang.IllegalAccessError")
	}
	self.class = c
}
